/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package PanelDeProductos;

import PanelesDePlatos.ModificarPlato;
import PanelesDeTrabajo.PanelPrincipalProducto;
import com.google.gson.Gson;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;

/**
 *
 * @author Pato
 */
public class ModificarProducto extends JPanel implements ActionListener,MouseListener{
    
    private JLabel labelNombreBox, labelNombre,labelCodigo, labelPrecio, labelValoracion;
    private JTextField  textoPrecio, textoCodigo, textoNombre, textoValoracion;
    private JPanel panelDatos;
    private JButton modificar;
    private JComboBox comboBoxProductos;
    private ArrayList<Producto> productos = new ArrayList<Producto>();
    private Gson gson = new Gson();
    private int indiceProductoModificado;
    
    public ModificarProducto()
    {
        this.setLayout(new BorderLayout());
        this.panelDatos = new JPanel();
        this.panelDatos.setLayout(new MigLayout());
        this.labelNombreBox = new JLabel("Nombre");
        this.labelNombreBox = new JLabel("Nombre");
        this.labelValoracion = new JLabel("Valoración");
        this.labelCodigo = new JLabel("Codigo");
        this.labelPrecio = new JLabel("Precio $");
        this.labelNombre = new JLabel("Nombre");
        
        this.comboBoxProductos = new JComboBox();
        this.textoPrecio = new JTextField(20);
        this.textoCodigo = new JTextField(20);
        this.textoNombre = new JTextField(20);
        this.textoValoracion = new JTextField(20);
        
        this.modificar = new JButton("Modificar");
        
        this.panelDatos.add(labelNombreBox);
        this.panelDatos.add(comboBoxProductos,"wrap");
        this.panelDatos.add(labelNombre);
        this.panelDatos.add(textoNombre, "wrap");
        this.panelDatos.add(labelPrecio);
        this.panelDatos.add(textoPrecio,"wrap");
        this.panelDatos.add(labelCodigo);
        this.panelDatos.add(textoCodigo,"wrap");
        this.panelDatos.add(labelValoracion);
        this.panelDatos.add(textoValoracion);
        
        this.comboBoxProductos.addActionListener(this);
        this.modificar.addActionListener(this);
        
        this.panelDatos.add(modificar);
       
        this.add(panelDatos, BorderLayout.CENTER);
        
        llenarComboBoxProductos();
        
    }

    @Override
    public void actionPerformed(ActionEvent e) 
    {
        Object click = e.getSource();
       
        boolean codigoVacio = textoCodigo.getText().isEmpty();
        boolean precioVacio = textoPrecio.getText().isEmpty();
        boolean nombreVacio = textoNombre.getText().isEmpty();
        
        if (click == modificar)
        {
            if (!codigoVacio && !precioVacio && !nombreVacio)
            {
                int precio = Integer.parseInt(textoPrecio.getText());
                String codigo = textoCodigo.getText();
                String nombre = textoNombre.getText();
                float valoracion = Float.parseFloat(textoValoracion.getText());
                
                Producto producto = new Producto(nombre, precio, codigo, valoracion);
                reemplazarProductoModificado(producto);
                
                try 
                {
                    vaciarTxt();
                    reescribirTxt();
                } 
                catch (IOException ex) 
                {
                    Logger.getLogger(ModificarPlato.class.getName()).log(Level.SEVERE, null, ex);
                }
                
                JOptionPane.showMessageDialog(this, "Producto modificado correctamente");
                llenarCamposModificables(nombre);
                llenarComboBoxProductos();
            }
            
        }
        if (click == comboBoxProductos)
        {
            if (comboBoxProductos.getItemCount() > 0)
            {
                String nombre = comboBoxProductos.getSelectedItem().toString();
                llenarCamposModificables(nombre);
            }
        }
    }

    @Override
    public void mouseClicked(MouseEvent e) 
    {
        
    }

    @Override
    public void mousePressed(MouseEvent e) 
    {
        
    }

    @Override
    public void mouseReleased(MouseEvent e) 
    {
        
    }

    @Override
    public void mouseEntered(MouseEvent e) 
    {
        
    }

    @Override
    public void mouseExited(MouseEvent e) 
    {
        
    }
    
    public void leerPlatosTxt()
    {
        File archivo = null;
        FileReader fr = null;
        BufferedReader br = null;
        productos.clear();
        
        try
        {
            archivo = new File ("C:\\BaseDeDatos\\productos.txt");
            fr = new FileReader (archivo);
            br = new BufferedReader(fr);
            
            String linea;
            
            while((linea=br.readLine())!=null)
            {
                Producto producto = (Producto)gson.fromJson(linea, Producto.class);
                productos.add(producto);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if( null != fr )
                {   
                    fr.close();     
                }                  
            }
            catch (Exception e2)
            {
                e2.printStackTrace();
            }
        }
    }
    
    public void vaciarTxt() throws IOException
    {
        File archivo = new File("C:\\BaseDeDatos\\productos.txt");
        FileWriter fw = new FileWriter(archivo);
        BufferedWriter bw = new BufferedWriter(fw);
        
        bw.write("");
        bw.close();
    }
    
    public void reescribirTxt()
    {
        try
        {   
            FileWriter writer = new FileWriter("C:\\BaseDeDatos\\productos.txt", true);
            
            for (int i=0; i<productos.size(); i++)
            {
                String producto = gson.toJson(productos.get(i)); //Transformamos a String un objeto Plato
                writer.write(producto);
                writer.write("\n");
            }
            writer.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    
    public boolean hayAlgoTxt()
    {
        File archivo = new File("C:\\BaseDeDatos\\productos.txt");
        
        if (archivo.length() == 0)
        {
            return false; //No hay nada
        }
        return true; //Hay algo escrito
    }
    
    public void llenarComboBoxProductos()
    {
        comboBoxProductos.removeAllItems();
        
        for (int i=0; i<productos.size(); i++)
        {
            comboBoxProductos.addItem(productos.get(i).getNombre());
        }
    }
    
    public void llenarCamposModificables(String nombre)
    {
        if (hayAlgoTxt())
        {
            for (int i=0; i<productos.size(); i++)
            {
                if (productos.get(i).getNombre().equals(nombre))
                {
                    textoNombre.setText(nombre);
                    textoPrecio.setText(productos.get(i).getPrecio()+"");
                    textoCodigo.setText(productos.get(i).getCodigo());
                    indiceProductoModificado = i;
                    i = productos.size();
                }
            }
        }
    }
    
    public void reemplazarProductoModificado(Producto producto)
    {
        productos.set(indiceProductoModificado, producto);
        updateUI();
    }
    
    public ArrayList<Producto> getProductos()
    {
        return productos;
    }
}
